// 数据监听器

function defineReactive(data, key, val) {
  // 遍历所有子属性
  observe(val)

  Object.defineProperty(data, key, {
    enumerable: true, // 属性是否会出现在for in 或者 Object.keys()的遍历中
    configurable: true, // 属性是否配置，以及可否删除
    get: function () {
      return val
    },
    set: function(newVal) {
      val = newVal
      console.log('属性')
    }
  })
}

function observe(data) {
  if (!data || typeof data !== 'object') {
    return
  }
  Object.keys(data).forEach(function (key) {
    defineReactive(data, key, data[key])
  })
}

var library = {
  book1: { name: '' },
  book2: ''
}

observe(library)
library.book1.name = 'vue权威指南'
library.book2 = '没有书籍'